package com.bailian.system.mapper;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import com.bailian.system.domain.BlPark;
import com.bailian.common.core.domain.BaseEntity;
import com.bailian.system.domain.vo.BlParkVo;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Param;

/**
 * 园区信息Mapper接口
 * 
 * @author bailian
 * @date 2025-08-04
 */
public interface BlParkMapper 
{
    /**
     * 根据ID查询园区信息
     * 
     * @param parkId 园区ID
     * @return 园区信息
     */
    BlPark selectById(Long parkId);

    /**
     * 查询园区列表
     * 
     * @param park 查询条件
     * @return 园区列表
     */
    List<BlPark> selectList(BlPark park);

    /**
     * 根据区域ID查询园区列表
     */
    List<BlParkVo> selectListByAreaId(@Param("areaId") Long areaId);

    /**
     * 分页查询园区列表
     * 
     * @param park 查询条件
     * @return 园区列表
     */
    Page<BlPark> selectPage(BlPark park);

    /**
     * 原始分页查询园区列表（带分页参数）
     * 
     * @param park 查询条件
     * @param offset 偏移量
     * @param limit 每页条数
     * @return 园区列表
     */
    List<BlPark> selectPageWithLimit(@Param("park") BlPark park, @Param("offset") int offset, @Param("limit") int limit);

    /**
     * 查询符合条件的园区总数
     * 
     * @param park 查询条件
     * @return 总数
     */
    long selectCount(@Param("park") BlPark park);
    /**
     * 根据条件查询园区列表
     * 
     * @param conditions 查询条件
     * @return 园区列表
     */
    Page<BlPark> selectByConditions(Map<String, Object> conditions);

    /**
     * 根据标签查询园区列表
     * 
     * @param tagName 标签名称
     * @return 园区列表
     */
    List<BlPark> selectByTag(String tagName);

    /**
     * 根据仓库类型查询园区列表
     * 
     * @param warehouseType 仓库类型
     * @return 园区列表
     */
    List<BlPark> selectByWarehouseType(String warehouseType);

    /**
     * 根据硬件配置查询园区列表
     * 
     * @param hardwareConfig 硬件配置
     * @return 园区列表
     */
    List<BlPark> selectByHardwareConfig(String hardwareConfig);

    /**
     * 根据服务类型查询园区列表
     * 
     * @param serviceType 服务类型
     * @return 园区列表
     */
    List<BlPark> selectByServiceType(String serviceType);

    /**
     * 根据推荐状态查询园区列表
     * 
     * @param isRecommend 推荐状态 (0-否, 1-是)
     * @return 园区列表
     */
    List<BlPark> selectByRecommend(String isRecommend);

    /**
     * 根据价格范围查询园区列表
     * 
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @return 园区列表
     */
    List<BlPark> selectByPriceRange(@Param("minPrice") BigDecimal minPrice, @Param("maxPrice") BigDecimal maxPrice);

    /**
     * 根据面积范围查询园区列表
     * 
     * @param minArea 最小面积
     * @param maxArea 最大面积
     * @return 园区列表
     */
    List<BlPark> selectByAreaRange(@Param("minArea") BigDecimal minArea, @Param("maxArea") BigDecimal maxArea);

    /**
     * 根据地理位置查询园区列表
     * 
     * @param location 地理位置关键词
     * @return 园区列表
     */
    List<BlPark> selectByLocation(String location);

    /**
     * 查询推荐园区列表
     * 
     * @param limit 限制数量
     * @return 推荐园区列表
     */
    List<BlPark> selectRecommendList(int limit);

    /**
     * 查询热门园区列表
     * 
     * @param limit 限制数量
     * @return 热门园区列表
     */
    List<BlPark> selectHotList(@Param("limit") int limit);

    /**
     * 新增园区信息
     * 
     * @param park 园区信息
     * @return 影响行数
     */
    int insert(BlPark park);

    /**
     * 批量新增园区信息
     * 
     * @param parkList 园区信息列表
     * @return 影响行数
     */
    int insertBatch(List<BlPark> parkList);

    /**
     * 更新园区信息
     * 
     * @param park 园区信息
     * @return 影响行数
     */
    int update(BlPark park);

    /**
     * 根据ID删除园区信息
     * 
     * @param parkId 园区ID
     * @return 影响行数
     */
    int deleteById(Long parkId);

    /**
     * 批量删除园区信息
     * 
     * @param parkIds 园区ID数组
     * @return 影响行数
     */
    int deleteByIds(Long[] parkIds);

    /**
     * 统计园区总数
     * 
     * @param park 查询条件
     * @return 园区总数
     */
    int count(BlPark park);

    /**
     * 统计推荐园区数量
     * 
     * @return 推荐园区数量
     */
    int countRecommend();

    /**
     * 统计各类型园区数量
     * 
     * @return 各类型园区数量统计
     */
    List<Map<String, Object>> countByType();

    /**
     * 统计各区域园区数量
     * 
     * @return 各区域园区数量统计
     */
    List<Map<String, Object>> countByLocation();

    /**
     * 获取园区价格统计信息
     * 
     * @return 价格统计信息
     */
    Map<String, Object> getPriceStatistics();

    /**
     * 获取园区面积统计信息
     * 
     * @return 面积统计信息
     */
    Map<String, Object> getAreaStatistics();

    /**
     * 检查园区名称是否存在
     * 
     * @param parkName 园区名称
     * @param excludeId 排除的园区ID
     * @return 存在数量
     */
    int checkNameExists(String parkName, Long excludeId);

    /**
     * 更新园区推荐状态
     * 
     * @param parkId 园区ID
     * @param isRecommend 推荐状态
     * @return 影响行数
     */
    int updateRecommendStatus(Long parkId, String isRecommend);

    /**
     * 更新园区出租面积
     * 
     * @param parkId 园区ID
     * @param rentedArea 已出租面积
     * @return 影响行数
     */
    int updateRentedArea(Long parkId, BigDecimal rentedArea);

    /**
     * 批量根据ID查询园区信息
     * 
     * @param parkIds 园区ID数组
     * @return 园区列表
     */
    List<BlPark> selectByIds(Long[] parkIds);

    /**
     * 根据多个标签查询园区列表
     * 
     * @param tags 标签数组
     * @return 园区列表
     */
    List<BlPark> selectByTags(String[] tags);

    /**
     * 根据多个仓库类型查询园区列表
     * 
     * @param warehouseTypes 仓库类型数组
     * @return 园区列表
     */
    List<BlPark> selectByWarehouseTypes(@Param("warehouseTypes") String[] warehouseTypes);

    /**
     * 根据多个硬件配置查询园区列表
     * 
     * @param hardwareConfigs 硬件配置数组
     * @return 园区列表
     */
    List<BlPark> selectByHardwareConfigs(String[] hardwareConfigs);

    /**
     * 根据多个服务类型查询园区列表
     * 
     * @param serviceTypes 服务类型数组
     * @return 园区列表
     */
    List<BlPark> selectByServiceTypes(String[] serviceTypes);

    /**
     * 查询可用面积大于指定值的园区
     * 
     * @param availableArea 可用面积
     * @return 园区列表
     */
    List<BlPark> selectByAvailableArea(@Param("availableArea") BigDecimal availableArea);

    /**
     * 查询出租率低于指定值的园区
     * 
     * @param rentalRate 出租率
     * @return 园区列表
     */
    List<BlPark> selectByRentalRate(@Param("minRate") BigDecimal minRate, @Param("maxRate") BigDecimal maxRate);

    /**
     * 统计各价格区间的园区数量
     * 
     * @return 价格区间统计
     */
    List<Map<String, Object>> countByPriceRange();

    /**
     * 统计各面积区间的园区数量
     * 
     * @return 面积区间统计
     */
    List<Map<String, Object>> countByAreaRange();

    /**
     * 查询最近更新的园区
     * 
     * @param limit 限制数量
     * @return 园区列表
     */
    List<BlPark> selectRecentlyUpdated(@Param("limit") int limit);

    /**
     * 查询最新创建的园区
     * 
     * @param limit 限制数量
     * @return 园区列表
     */
    List<BlPark> selectRecentlyCreated(@Param("limit") int limit);

    /**
     * 根据综合条件查询园区
     * 
     * @param conditions 综合查询条件
     * @return 园区列表
     */
    List<BlPark> selectByComplexConditions(@Param("areaId") Long areaId, @Param("minPrice") BigDecimal minPrice, @Param("maxPrice") BigDecimal maxPrice, @Param("minArea") BigDecimal minArea, @Param("maxArea") BigDecimal maxArea, @Param("isRecommend") String isRecommend, @Param("warehouseTypes") List<String> warehouseTypes, @Param("tagIds") List<Long> tagIds);

    // 新增：根据ID查询园区信息（VO）
    BlParkVo selectVoById(Map<String, Object> params);

    // ========= 中间表维护 =========
    int deleteParkConfigsByParkId(Long parkId);
    int batchInsertParkConfigs(Long parkId, List<Long> parkConfigIds);

    int deleteParkServicesByParkId(Long parkId);
    int batchInsertParkServices(Long parkId, List<Long> serviceIds);

    int deleteParkTagsByParkId(Long parkId);
    int batchInsertParkTags(Long parkId, List<Long> tagIds);

    // ========= 关系查询 =========
    List<Long> selectParkConfigIdsByParkId(Long parkId);
    List<Long> selectParkServiceIdsByParkId(Long parkId);
    List<Long> selectParkTagIdsByParkId(Long parkId);

    // ========= 推荐状态管理 =========
    /**
     * 根据区域ID查询园区列表
     * 
     * @param areaId 区域ID
     * @return 园区列表
     */
    List<BlPark> selectByAreaId(Long areaId);

    /**
     * 将指定区域下除指定园区外的其他园区设置为非推荐状态
     * 
     * @param areaId 区域ID
     * @param excludeParkId 排除的园区ID
     * @return 影响行数
     */
    int updateOtherParksToNotRecommend(@Param("areaId") Long areaId, @Param("excludeParkId") Long excludeParkId);
}
